﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SharedConfiguration;

namespace OfficeDownloaderHelper
{
    public partial class Form1 : Form
    {
        Process process = new Process();
        string log;
        Config _config;
        public Form1()
        {
            InitializeComponent();
            toolStripStatusLabel1.Text = "Listo";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CambiarControles(false);
            while (folderBrowserDialog1.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                var res = MessageBox.Show("Tiene que seleccionar una carpeta con permisos de escritura (escritorio por ejempo). Si desea Cancelar, presione Cancelar", "", MessageBoxButtons.RetryCancel);
                if (res == System.Windows.Forms.DialogResult.Cancel)
                    return;
                FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, folderBrowserDialog1.SelectedPath);
                if (!SecurityManager.IsGranted(writePermission))
                {
                    MessageBox.Show("Parece que no tiene permisos en esa carpeta. Seleccione otra, por ejemplo, creándo una nueva en el escritorio");
                }
            }
            _config = new Config() { Path = folderBrowserDialog1.SelectedPath + @"\" };
            if (cb_es.Checked == true)
                _config.Idiomas.Add(new idioma(IdiomasEnum.Espanol));
            if (cb_ing.Checked == true)
                _config.Idiomas.Add(new idioma(IdiomasEnum.Ingles));
            if (cb_32.Checked == true)
                _config.Arquitectura.Add(ArquitecturaEnum.x86);
            if (cb_64.Checked == true)
                _config.Arquitectura.Add(ArquitecturaEnum.AMD64);



            if (XmlWriter.WriteConfigXML(_config))
                agregarAlLog("XML Creado");
            else
               agregarAlLog("Error Creando XML");
            
            

            agregarAlLog("Ejecutable copiado");
            guardarConfig();
            if(this.checkBox1.Checked == false)
                IniciarDescarga();
            agregarAlLog("Completado");
            CambiarControles(true);

        }

        private void CopiarDeploymentTool()
        {//Copiar el archivo
            var original = Path.GetDirectoryName(Application.ExecutablePath) + @"\setup.exe";
            File.Copy(original, _config.Path + "setup.exe", true);
        }

        private void IniciarDescarga()
        {
            try
            {
                CopiarDeploymentTool();
                agregarAlLog("Tratando de invocar la descarga");
                process.StartInfo.FileName = _config.Path + @"setup.exe";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.Arguments = "/download config.xml";
                process.StartInfo.WorkingDirectory = _config.Path;
                process.EnableRaisingEvents = true;
                process.Exited += (e3, a) => { agregarAlLog("Aplicación de descarga cerrada"); };

                process.Start();
                agregarAlLog("Descarga iniciada. Esto puede tardar muchas horas");
            }
            catch (Exception ex)
            {
                if (!process.HasExited)
                    process.Kill();
                agregarAlLog("Error en la descarga. Más información a continuación");
                agregarAlLog(ex.Message);
            }


        }

        private void guardarConfig()
        {
            var res = Newtonsoft.Json.JsonConvert.SerializeObject(_config);
            StreamWriter wr = new StreamWriter(_config.Path + "config.json");
            wr.Write(res);
            wr.Close();
        }
        private void CambiarControles(bool habilitados)
        {
            groupBox1.Enabled =
                groupBox2.Enabled =
                button1.Enabled =
                button2.Enabled =
                checkBox1.Enabled = 
                button3.Enabled = habilitados;
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            if (this.checkBox1.Checked == false)
            {
                if (!process.HasExited)
                    process.Kill(); 
            }
            base.OnClosing(e);
        }

        private void agregarAlLog(string texto)
        {
            log = texto + "\n" + log;
            this.richTextBox1.Text = log;
            toolStripStatusLabel1.Text = texto;
        }

    }
}
